#include <iostream>
#include <vector>
#include <cassert>
using namespace std;

template<class T>
class StackWithMin
{
public:
	vector<T> datas;
	vector<size_t> minStack;
	void push(T data);
	void pop();
	T min();
	void display();
};

template<class T>
void StackWithMin<T>::push(T data)
{
	datas.push_back(data);
	if (minStack.empty()||data<datas[minStack.back()])
	{
		minStack.push_back(datas.size()-1);
	}
}
template<class T>
void StackWithMin<T>::pop()
{
	assert(!datas.empty());
	if (datas.back()==datas[minStack.back()])
	{
		minStack.pop_back();
	}
	datas.pop_back();
}

template<class T>
T StackWithMin<T>::min()
{
	assert(!datas.empty()&&!minStack.empty());
	return datas[minStack.back()];
}
template<class T>
void StackWithMin<T>::display()
{
	for (int i=0;i<datas.size();i++)
	{
		cout<<datas[i]<<"   ";
	}
	cout<<"\n";
}

